package com.ls.fw.data.search.impl.dao.base;

import java.util.List;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.Sort;
import org.apache.lucene.search.highlight.Formatter;
import org.apache.lucene.search.highlight.Highlighter;

import com.ls.fw.common.beanparser.bean.PageBean;
import com.ls.fw.common.beanparser.statement.Select;
import com.ls.fw.data.search.impl.lucene.exception.IndexException;

/**
 * @author 李昇
 * 2014年4月13日 下午2:54:01
 */
public interface BaseIndexDao<T,PK> extends LuceneDao {

	
	/**
	 * 将文档内容转换为对象
	 * @author 李昇
	 * 2014年4月13日 下午4:19:21
	 * @param doc
	 * @param requiredType
	 * @param query
	 * @param high
	 * @return
	 */
	public Object doc2Obj(final Document doc,final Class<?> requiredType,final Query query,final boolean high);		
	
	public Object doc2Obj(final Document doc,final Query query,final boolean high);		
	
	/**
	 * 获取高亮
	 * @author 李昇
	 * 2014年4月13日 下午4:18:07
	 * @param query
	 * @return
	 */
	public Highlighter getHighlighter(final Query query);
	
	/**
	 * 根据字段获取其在索引中的值
	 * @author 李昇
	 * 2014年4月13日 下午4:17:35
	 * @param f
	 * @param doc
	 * @param highlight
	 * @param analyzer
	 * @param high
	 * @return
	 */
	public Object getValue(final java.lang.reflect.Field f,final String indexName, final Document doc, final Highlighter highlight, final Analyzer analyzer,final boolean high);


	/**
	 * 根据对象获取其索引文档对象
	 * @author 李昇
	 * 2014年4月13日 下午4:33:31
	 * @param model
	 * @return
	 */
	public Document getDocument(final T model);
	
	
	/**
	 * 处理字段
	 * @author 李昇
	 * 2014年4月13日 下午7:01:35
	 * @param f
	 * @param value
	 * @return
	 */
	public Field handlField(final java.lang.reflect.Field f, final Object value);
	
	/**
	 * 处理外键字段
	 * @author 李昇
	 * 2014年4月13日 下午7:05:53
	 * @param fkField
	 * @param value
	 * @return
	 */
	public Field handlFKField(final java.lang.reflect.Field fkField, final Object value);
	
	
	/**
	 * 高亮显示格式
	 * @author 李昇
	 * 2014年4月25日 下午8:45:11
	 * @return
	 */
	public Formatter getHighlighterFormatter();
	
	
	/**
	 * 该字段是否高亮显示
	 * @author 李昇
	 * 2014年4月26日 下午8:23:10
	 * @param name
	 * @return
	 */
	public boolean isHigherShow(String name);
	
	public void add(final T model) throws IndexException;
	
	public void add(final List<T> list) throws IndexException;
	
	public void update(final T model,final PK id) throws IndexException;
	
	public void delete(final PK id) throws IndexException;
	
	public void deleteAll() throws IndexException;
	
	public void delete(final String fkname,final PK id) throws IndexException;
	
	public Query getQuery(final Select select) throws IndexException;
	
	public Sort getSort(final Select select) throws IndexException;
	
	public PageBean query(final Select select) throws IndexException;
	
	public PageBean query(final Select select,Class<?> requiredType) throws IndexException;
	
	public long getSize(final Select select) throws IndexException;
}
